package com.objectproject.main.service.subsystem.validation;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.objectproject.main.dao.MyObjectHierarchyDAOImpl;
import com.objectproject.main.exception.ObjectHierarchyException;
import com.objectproject.main.model.MyObject;

@Service
public class ObjectHierarchyValidator{
	
	@Autowired
	MyObjectHierarchyDAOImpl myObjectHierarchyDAOImpl;
	
	public void beforeInsert(MyObject myObject, MyObject superObject)
			throws ObjectHierarchyException {
		
		//NULL 체크
		if(superObject == null){
			throw new ObjectHierarchyException("상속하려는 오브젝트가 NULL입니다.");
		}
		
		ArrayList<Long> ancestorsOfMyObject = myObjectHierarchyDAOImpl.selectAncestorObjectIds(superObject.getObjectId());
		ArrayList<Long> ancestorsOfSuperObject = myObjectHierarchyDAOImpl.selectAncestorObjectIds(myObject.getObjectId());
		
		//동일 여부 체크
		if(myObject.equals(superObject)){
			throw new ObjectHierarchyException("상속하려는 오브젝트가 입력 오브젝트와 동일합니다.");
		}
		
		//이미존재하는지 여부 체크
		if(ancestorsOfMyObject.contains(superObject.getObjectId())){
			throw new ObjectHierarchyException("이미 상속하고 있는 오브젝트입니다.");
		}
		
		//사이클 체크
		if(ancestorsOfSuperObject.contains(myObject.getObjectId())){
			throw new ObjectHierarchyException("상속하려는 오브젝트의 조상에 입력 오브젝트가 있습니다.");
		}
		
		//루트를 제외한 다이아몬드 상속 문제 체크 -- 일단보류
		/*for(Long myObjectId:ancestorsOfMyObject){
			if(ancestorsOfSuperObject.contains(myObjectId)){
				if(myObjectId != PolicyAndConfigurationRepository.ROOT_OBJECT_ID){
					//루트오브젝트를 제외하고 중첩되는 것이 있다면 다이아몬드 문제
					throw new ObjectHierarchyException("입력 오브젝트와 상속하려는 오브젝트의 루트를 제외한 공통 조상이 발견되었습니다. : " + myObjectId);
					
				}
			}
		}*/
		
		
	}

	
	public void afterInsert(MyObject myObject, MyObject superObject)
			throws ObjectHierarchyException {
		// TODO Auto-generated method stub
		
	}


	public void beforeDelete(MyObject myObject, MyObject superObject)
			throws ObjectHierarchyException {
		// TODO Auto-generated method stub
		
	}

	
	public void afterDelete(MyObject myObject, MyObject superObject)
			throws ObjectHierarchyException {
		// TODO Auto-generated method stub
		
	}
}
